package org.common.utils.event;
import com.esotericsoftware.reflectasm.MethodAccess;
import java.lang.reflect.Method;

/**
 * 事件对象
 * @author zhouzhibing
 * @date 2025/2/24
 */
class EventObject {

    /**
     * 实例类的Class对象，用于反射获取类的信息
     */
    private final Class<?> instanceClass;

    /**
     * 实例方法的Method对象，用于反射调用特定方法
     */
    private final Method instanceMethod;

    /**
     * 实例对象，可以是任何类型的对象，用于方法调用或属性访问
     */
    private final Object instance;

    /**
     * MethodAccess对象，来自MapStruct库，用于高效访问方法
     */
    private final MethodAccess methodAccess;

    /**
     * 方法索引，用于快速定位MethodAccess中的方法
     */
    private final int methodIndex;

    /**
     * 事件地址，用于标识事件
     */
    private final String eventAddress;

    EventObject(Class<?> instanceClass, Method instanceMethod, Object instance, MethodAccess methodAccess, int methodIndex) {
        this.instanceClass = instanceClass;
        this.instanceMethod = instanceMethod;
        this.instance = instance;
        this.methodAccess = methodAccess;
        this.methodIndex = methodIndex;
        this.eventAddress = instanceClass.getName() + "#" + instanceMethod.getName();
    }

    /**
     * 执行调用
     * @param parameter 事件参数
     */
    public void invoke(Object parameter) {
        methodAccess.invoke(instance , methodIndex , parameter);
    }

    /**
     * 获取事件地址 , 类名#方法名
     * @return 事件地址
     */
    public String getEventAddress() {
        return eventAddress;
    }
}

